﻿package com.eitb.programas.diputacion{
	import flash.display.*;
	import flash.events.*;
	import fl.events.*;
	import flash.net.*;
	import flash.utils.*;
	import flash.media.*;
	import com.eitb.cargadores.*;
	import com.eitb.colecciones.*;
	import com.eitb.formaters.*;
	import com.eitb.literales.*;
	import com.eitb.reproductores.*;
	import com.eitb.imagenes.*;
	import com.eitb.programas.diputacion.rutas.*;
	import com.eitb.programas.diputacion.entidades.*;
	import com.eitb.programas.diputacion.literales.*;
	import com.eitb.util.logging.*;

	public class ModeloDiputacion implements IControladorCargador,IControladorDiputacion,IControladorPestana,IControladorVideo,IControladorGallery {
		
		private var vMain:Main;
		private var vDiputacion:IVistaDiputacion;
		private var vVideo:IVistaVideo;
		private var vPestana:IVistaPestana;
		private var vGallery:IVistaGallery;
		private var vCargador:IVistaCargador;

		private var literales:ILiterales;
		private var literalesCargador:ILiterales;
		

		private var proyectos:Array;
		private var proyectosFiltrados:Array;
		private var filtered:Array;
		
		private var bitmaps:Array;
		private var xmlData:XMLList;
		private var proyecto:Proyecto;

		private var connection:NetConnection;
		private var stream:NetStream;
		private var soundChannel:SoundChannel;

		private var anoSelected:String;
		private var entidadSelected:String;
		private var proyectoSelected:String;
		private var keySelected:String;

		private var idioma:int;

		private var pestanaShowed:Boolean;
		private var isVideoPlaying:Boolean;
		private var isAudioPlaying:Boolean;
		private var isFiltered:Boolean;

		private var soundPosition:Number;
		private var bitmapPosition:int;
		
		private var categoria:String;

		public function ModeloDiputacion(categoria:String):void {
			this.proyectos=new Array ();
			this.bitmaps = new Array();
			this.anoSelected=null;
			this.entidadSelected=null;
			this.proyectoSelected=null;
			this.keySelected=null;
			this.proyecto=null;
			this.pestanaShowed=false;
			this.isVideoPlaying=false;
			this.isAudioPlaying=false;
			this.isFiltered=false;
			this.bitmapPosition=0;
			this.categoria = categoria;
		}

		// INIT COMPONENTES
		public function initVista(vDiputacion:IVistaDiputacion):void {
			this.vDiputacion=vDiputacion;
		}
		
		public function initMain(vMain:Main):void {
			this.vMain=vMain;
		}

		public function initVistaVideo(vVideo:IVistaVideo):void {
			this.vVideo=vVideo;
		}

		public function initVistaPestana(vPestana:IVistaPestana):void {
			this.vPestana=vPestana;
		}
		public function initVistaGallery(vGallery:IVistaGallery):void {
			this.vGallery=vGallery;
		}
		public function initVistaCargador(vCargador:IVistaCargador):void {
			this.vCargador = vCargador;
		}
		// INIT COMPONENTES

		// INIT PARAMETROS
		public function initIdioma(idioma:int):void {
			this.idioma=idioma;
		}

		public function initLiterales(literales:ILiterales) {
			this.literales=literales;
			
			this.vGallery.setAnteriorBtnText(this.literales.getLiteral(DiputacionLiterales.ANTERIOR));
			this.vGallery.setSiguienteBtnText(this.literales.getLiteral(DiputacionLiterales.SIGUIENTE));
			
			this.vDiputacion.setImagenBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_IMAGEN));
			this.vDiputacion.setVideoBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_VIDEO));
			this.vDiputacion.setPdfBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_PDF));
			this.vDiputacion.setAudioBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_AUDIO));
			
			this.vPestana.setLimpiarBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_LIMPIAR));
			this.vPestana.setAceptarBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_ACEPTAR));
			
			
			this.vPestana.setTablaAnyoHeader(this.literales.getLiteral(DiputacionLiterales.TABLA_PROYECTOS_HEADER_ANYO));
			this.vPestana.setTablaEntidadHeader(this.literales.getLiteral(DiputacionLiterales.TABLA_PROYECTOS_HEADER_ENTIDAD));
			this.vPestana.setTablaProyectoHeader(this.literales.getLiteral(DiputacionLiterales.TABLA_PROYECTOS_HEADER_PROYECTO));
			this.vPestana.setKeysProyectoHeader(this.literales.getLiteral(DiputacionLiterales.TABLA_PROYECTOS_HEADER_KEYS));
			this.vPestana.setPrincipalBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_MENU_PRINCIPAL));
			this.vPestana.setFiltrarBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_FILTRAR));
		}

		public function initLiteralesCargador(literales:ILiterales) {
			this.literalesCargador = literales;
			this.vCargador.setCargadorInfo(this.literalesCargador.getLiteral(CargadorLiterales.DESCARGANDO));
		}

		public function initXmlData(xmlData:XMLList) {
			this.xmlData=xmlData;
			// carga los proyectos
			for each (var xmlProy:XML in xmlData..proyecto) {
				var proyecto:Proyecto=new Proyecto  ;
				var imagenes:Array=new Array  ;
				var provincias:Array=new Array  ;
				var entidades:Array=new Array  ;
				var palabrasClave:Array=new Array;
				proyecto.setId(xmlProy.id);
				if(this.idioma == 1) {
					proyecto.setCategoria(xmlProy.categoria_es);
				} else if(this.idioma == 4) {
					proyecto.setCategoria(xmlProy.categoria_eu);
				}
				proyecto.setAno(xmlProy.ano);
				proyecto.setTitulo(xmlProy.titulo);
				proyecto.setSumario(xmlProy.sumario);
				proyecto.setDescripcion(xmlProy.descripcion);
				proyecto.setPdf(xmlProy.pdf);
				proyecto.setAudio(xmlProy.audio);
				proyecto.setVideo(xmlProy.video);
				
				for each (var imagen:String in xmlProy.imagenes..imagen) {
					imagenes.push(imagen);
				}
				proyecto.setImagenes(imagenes);
				for each (var provincia:String in xmlProy.provincias..provincia) {
					provincias.push(provincia);
				}
				proyecto.setProvincias(provincias);
				for each (var entidad:String in xmlProy.entidades..entidad) {
					entidades.push(entidad);
				}
				proyecto.setEntidades(entidades);
				var skeys:String = xmlProy.palabrasclave;
				var aKeys:Array = skeys.split(",");
				for each (var key:String in aKeys) {
					palabrasClave.push(key);
				}
				proyecto.setPalabrasClave(palabrasClave);
				this.proyectos.push(proyecto);
			}
		}
		private function initVideo():void {
			var obj:Object=new Object  ;
			this.connection=new NetConnection  ;

			obj.onMetaData=this.onMetaData;
			this.connection.connect(null);

			this.stream=new NetStream(this.connection);
			this.stream.client=obj;
			this.stream.addEventListener(NetStatusEvent.NET_STATUS,onStreamHandler);
			this.stream.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
			this.stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR,errorHandler);
			this.stream.bufferTime=2;
			this.vVideo.attachNetStream(this.stream);
		}
		private function initGallery():void {
			var loader:Loader;
			// inicia el puntero de imagen
			this.bitmapPosition=0;
			this.bitmaps = new Array();
			// carga todas las imagenes
			for each (var image:String in this.proyecto.getImagenes()) {
				loader=new Loader();
				loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImageCompleteHandler);
				loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
				loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
				try {
					loader.load(new URLRequest(image));
				} catch (error:Error) {
				}
			}
		}
		// INIT PARAMETROS

		// FLUJO
		private function onImageCompleteHandler(evt:Event):void {
			// que se vea la primera imagen
			var loader:Loader=Loader(evt.target.loader);
			var bitmap:Bitmap=Bitmap(loader.content);

			this.bitmaps.push(bitmap);
			if (this.bitmaps.length==this.proyecto.getImagenes().length) {
				this.vGallery.setImage(this.bitmaps[0]);
				this.checkGalleryButtons();
				this.vGallery.setVisible(true);
			}
		}
		private function progressHandler(evt:ProgressEvent):void {
			var porcentaje:Number = evt.bytesLoaded / evt.bytesTotal;
			this.vCargador.setCargadorContador(new PercentFormater(porcentaje).format(this.idioma));	
			this.vCargador.setCargadorProgress(porcentaje);			
			this.vCargador.setCargadorVisible((porcentaje != 1) && null == this.bitmaps[this.bitmapPosition]);
		}
		private function ioErrorHandler(evt:IOErrorEvent):void {
			Logger.log.info("Error I/O: "+evt.text);
		}

		private function onMetaData(info:Object) {
			Logger.log.info(info.toString());
		}

		private function errorHandler(evt:ErrorEvent):void {
			Logger.log.info("Error generico: "+evt.text);
		}

		
		
		public function start():void {
			Logger.log.info("Selected category: " + this.categoria);
			this.vPestana.showDebug(this.categoria);
			this.filterProjectsByCategory();
			// inicia los comboBox
			this.loadComboBox(this.proyectosFiltrados);
			// pone la pestaña en la posición inicial
			this.togglePestana();
			this.vPestana.printTable(this.proyectosFiltrados);
		}
		
		private function filterProjectsByCategory():void {
			this.proyectosFiltrados = new Array();
			for each (var proyecto:Proyecto in proyectos) {
				if(proyecto.getCategoria().toLowerCase() == this.categoria.toLowerCase()) {
					this.proyectosFiltrados.push(proyecto);
				}
			}
		}
		
		public function addAnosCbx(proyectos:Array):void {
			var anos:Array=new Array  ;
			for each (var proyecto:Proyecto in proyectos) {
				anos.push(proyecto.getAno());
			}
			anos=Collections.removeDuplicates(anos);
			for each (var ano:String in anos) {
				this.vPestana.setAnoCbxItem(ano);
			}
			this.vPestana.setAnoCbxItem("todos");
			if(this.anoSelected != null) {
				this.vPestana.setAnoPrompt(this.anoSelected);
			}
		}
		
		public function addKeysCbx(proyectos:Array):void {
			var keys:Array=new Array;
			for each (var proyecto:Proyecto in proyectos) {
				for each (var palabraClave:String in proyecto.getPalabrasClave()) {
					keys.push(palabraClave);
				}
			}
			keys=Collections.removeDuplicates(keys);
			for each (var key:String in keys) {
				this.vPestana.setKeyCbxItem(key);
			}
			this.vPestana.setKeyCbxItem("todas");
			if(this.keySelected != null) {
				this.vPestana.setKeysPrompt(this.keySelected);
			}
		}
		
		public function addEntidadesCbx(proyectos:Array):void {
			var entidad:String;
			var entidades:Array=new Array  ;
			for each (var proyecto:Proyecto in proyectos) {
				for each (entidad in proyecto.getEntidades()) {
					entidades.push(entidad);
				}
			}
			entidades=Collections.removeDuplicates(entidades);
			for each (entidad in entidades) {
				this.vPestana.setEntidadCbxItem(entidad);
			}
			this.vPestana.setEntidadCbxItem("todas");
			if(this.entidadSelected != null) {
				this.vPestana.setEntidadPrompt(this.entidadSelected);
			}
		}
		
		
		// FLUJO

		// IControladorPestana
		
		public function onFiltrarBtnClick(evt:MouseEvent):void {
			trace("Año selected: " + this.anoSelected);
			trace("Entidad selected: " + this.entidadSelected);
			trace("key selected: " + this.keySelected);
			this.isFiltered = true;
			this.filtered = new Array();
			for each (var proyecto:Proyecto in this.proyectosFiltrados) {
				this.filtered.push(proyecto);
			}
			if(this.anoSelected != null && this.anoSelected != "todos") {
				this.filtered = this.filtered.filter(filterAno);
			}
			if(this.entidadSelected != null && this.entidadSelected !="todas") {
				this.filtered = this.filtered.filter(filterEntidad);
			}
			if(this.keySelected != null && this.keySelected !="todas") {
				this.filtered = this.filtered.filter(filterKey);
			}
			this.vPestana.printTable(this.filtered);
			this.loadComboBox(this.filtered);
			
		}
		
		private function filterKey(element:*,index:int,arr:Array):Boolean {
			for each (var key:String in element.getPalabrasClave()) {
					if(key==this.keySelected) {
						return true;
					}
			}
			return false;
		}
		
		private function filterAno(element:*,index:int,arr:Array):Boolean {
			return element.getAno()==this.anoSelected;
		}

		private function filterEntidad(element:*,index:int,arr:Array):Boolean {
			var rslt:Boolean=false;
			for each (var entidad:String in element.getEntidades()) {
				if (entidad==this.entidadSelected) {
					rslt=true;
					break;
				}
			}
			return rslt;
		}
		
		
		public function onProyectoClick(evt:ListEvent):void {
			this.proyecto=this.proyectosFiltrados[evt.rowIndex];
			if(this.isFiltered) {
				this.proyecto=this.filtered[evt.rowIndex];
			}
			this.vPestana.setAceptarBtnVisible(true);
		}
		
		public function onAnoCbxChange(evt:Event):void {
			this.anoSelected=evt.currentTarget.selectedItem.data;
			this.btnsVisibility();
			this.cbxsEnabled();
			this.reloadCbxsData();
			//this.vPestana.loadPestanaEvents(this.onPestanaBtnClick);
		}
		
		public function onKeysCbxChange(evt:Event):void {
			this.keySelected=evt.currentTarget.selectedItem.data;
			this.btnsVisibility();
			this.cbxsEnabled();
			this.reloadCbxsData();
		}
		
		
		public function onEntidadCbxChange(evt:Event):void {
			this.entidadSelected=evt.currentTarget.selectedItem.data;
			this.btnsVisibility();
			this.cbxsEnabled();
			this.reloadCbxsData();
		}
		
		public function onPrincipalBtnClick(evt:MouseEvent):void {
			this.vMain.startIntermedia();
		}
		
		public function onProyectoCbxChange(evt:Event):void {
			this.proyectoSelected=evt.currentTarget.selectedItem.data;
			this.btnsVisibility();
			this.cbxsEnabled();
			this.reloadCbxsData();
		}
		public function onLimpiarBtnClick(evt:MouseEvent):void {
			this.anoSelected=null;
			this.entidadSelected=null;
			this.proyectoSelected=null;
			this.vPestana.cbxSelectionNone();
			this.btnsVisibility();
			this.cbxsEnabled();
			this.reloadCbxsData("all");
		}
		public function onAceptarBtnClick(evt:MouseEvent):void {
			// carga evento transicion de pestanaña
			this.vPestana.loadPestanaEvents(this.onPestanaBtnClick);
			// carga los datos del proyecto en pantalla
			this.vDiputacion.loadProject(this.proyecto);
			// comprueba y prepara el video si es necesario
			if (null!=this.proyecto.getVideo()) {
				this.initVideo();
			}
			// comprueba y prepara las imagenes si es necesario
			if (0!=this.proyecto.getImagenes().length) {
				this.initGallery();
			}
			// oculta la pestaña
			this.togglePestana();
			// detiene audio y video
			try {
				this.stream.close();
			} catch (error:Error) {
			}
			try {
				this.soundChannel.stop();
			} catch (error:Error) {
			}
		}
		public function onPestanaBtnClick(evt:MouseEvent):void {
			this.togglePestana();
		}
		// IControladorPestana
		// IControladorDiputacion
		public function onVideoBtnClick(evt:MouseEvent):void {
			if (this.isAudioPlaying) {
				this.soundChannel.stop();
			}
			this.stream.play(this.proyecto.getVideo());
			this.setVideoPlaying(true);
			if (0!=this.proyecto.getImagenes().length) {
				this.vGallery.setVisible(false);
			}
		}
		public function onPdfBtnClick(evt:MouseEvent):void {
			navigateToURL(new URLRequest(this.proyecto.getPdf()));
		}
		public function onAudioBtnClick(evt:MouseEvent):void {
			if (this.isVideoPlaying) {
				this.setVideoPlaying(false);
			}
			if (this.isAudioPlaying) {
				this.soundChannel.stop();
			}
			this.soundChannel=new Sound(new URLRequest(this.proyecto.getAudio()),new SoundLoaderContext(1000)).play(0,0);
			this.isAudioPlaying=true;
			if (0!=this.proyecto.getImagenes().length) {
				this.vGallery.setVisible(true);
			}
		}
		public function onImagenBtnClick(evt:MouseEvent):void {
			this.setVideoPlaying(false);
			this.vGallery.setVisible(true);
		}
		// IControladorDiputacion
		// IControladorVideo
		private function setVideoPlaying(playing:Boolean) {
			this.isVideoPlaying=playing;
			this.vVideo.setVisible(playing);
			if (playing) {
				this.stream.resume();
			} else {
				this.stream.pause();
			}
		}
		private function setAudioPlaying(playing:Boolean) {
			this.isAudioPlaying=playing;
			if (playing) {
				this.soundChannel=new Sound(new URLRequest(this.proyecto.getAudio()),new SoundLoaderContext(1000)).play(this.soundPosition,0);
			} else {
				try {
					this.soundPosition=this.soundChannel.position;
					this.soundChannel.stop();
				} catch (error:Error) {
				}
			}
		}
		// IControladorVideo
		// IControladorGallery
		public function onSiguienteBtnClick(evt:MouseEvent):void {
			if (++this.bitmapPosition > (this.proyecto.getImagenes().length -1)) {
				this.bitmapPosition--;
			}
			this.vGallery.setImage(this.bitmaps[this.bitmapPosition]);
			this.checkGalleryButtons();
		}
		public function onAnteriorBtnClick(evt:MouseEvent):void {
			if (--this.bitmapPosition<0) {
				this.bitmapPosition++;
			}
			this.vGallery.setImage(this.bitmaps[this.bitmapPosition]);
			this.checkGalleryButtons();
		}
		// IControladorGallery

		// IControladorCargador
		public function addElementos(numero:int):void {

		}

		public function removeElementos(numero:int):void {

		}
		// IControladorCargador

		private function checkGalleryButtons():void {
			this.vGallery.setAnteriorBtnVisibile(0 != this.bitmapPosition);
			this.vGallery.setSiguienteBtnVisible(this.bitmapPosition != (this.proyecto.getImagenes().length -1));
		}
		private function onStreamHandler(evt:NetStatusEvent) {
			if (evt.info.code=="NetStream.Play.Stop") {
				this.stream.close();
			}
		}
		private function togglePestana():void {
			this.pestanaShowed=! this.pestanaShowed;
			if (this.pestanaShowed) {
				try {
					this.vVideo.setVisible(false);
					this.stream.pause();
				} catch (error:Error) {
				}
				try {
					this.soundPosition=this.soundChannel.position;
					this.soundChannel.stop();
				} catch (error:Error) {
				}
				this.vDiputacion.showPestana();
				this.vPestana.transicion(true);
				this.vVideo.setVisible(false);
				this.vGallery.setVisible(false);
			} else {
				try {
					this.setVideoPlaying(this.isVideoPlaying);
					this.setAudioPlaying(this.isAudioPlaying);
				} catch (error:Error) {
				}
				var pdfBtnVisible:Boolean=""!=this.proyecto.getPdf();
				var audioBtnVisible:Boolean=""!=this.proyecto.getAudio();
				var videoBtnVisible:Boolean=""!=this.proyecto.getVideo();
				var imagenBtnVisible:Boolean=0!=this.proyecto.getImagenes().length;

				var videoPlyVisible:Boolean=this.isVideoPlaying&&""!=this.proyecto.getVideo();
				var galleryVisible:Boolean=! this.isVideoPlaying&&imagenBtnVisible;

				this.vDiputacion.hidePestana(pdfBtnVisible,audioBtnVisible,videoBtnVisible,imagenBtnVisible,videoPlyVisible);
				this.vPestana.transicion(false);
				this.vVideo.setVisible(videoPlyVisible);
				this.vGallery.setVisible(galleryVisible);
			}
		}

		private function loadComboBox(proyectos:Array):void {
			// si solo hay un proyecto lo guarda como proyectoseleccionado
			if (1==proyectos.length) {
				this.proyecto=proyectos[0];
			}
			// inicializa los combobox
			this.vPestana.initAnoCbx(this.literales.getLiteral(DiputacionLiterales.SELECCIONAR_ANO));
			this.vPestana.initEntidadCbx(this.literales.getLiteral(DiputacionLiterales.SELECCIONAR_ENTIDAD));
			this.vPestana.initKeysCbx(this.literales.getLiteral(DiputacionLiterales.SELECCIONAR_KEY));
			// carga los datos en los combo box
			this.addAnosCbx(proyectos);
			this.addEntidadesCbx(proyectos);
			this.addKeysCbx(proyectos);
		}
		private function reloadCbxsData(what:String=null):void {
			if (null!=what) {
				// carga todo
				this.loadComboBox(this.proyectosFiltrados);
			} else {
				var tmpPro:Array=this.proyectosFiltrados;

				// fitra proyectos
				//if (null!=this.anoSelected) {
					//tmpPro=tmpPro.filter(this.filterAno);
				//}
				//if (null!=this.entidadSelected) {
					//tmpPro=tmpPro.filter(this.filterEntidad);
				//}
				//if (null!=this.proyectoSelected) {
					//tmpPro=tmpPro.filter(this.filterProyecto);
				//}

				// carga todos los combos ?
				this.loadComboBox(tmpPro);

				// pone las etiquetas
				if (null!=this.anoSelected) {
					this.vPestana.setAnoPrompt(this.anoSelected);
				}
				if (null!=this.entidadSelected) {
					this.vPestana.setEntidadPrompt(this.entidadSelected);
				}
				if (null!=this.keySelected) {
					this.vPestana.setKeysPrompt(this.keySelected);
				}
			}
		}

		

		private function filterProyecto(element:*,index:int,arr:Array):Boolean {
			return element.getTitulo()==this.proyectoSelected;
		}

		private function btnsVisibility():void {
			this.vPestana.setLimpiarBtnVisible(null!=this.anoSelected||null!=this.entidadSelected||null!=this.proyectoSelected);
			this.vPestana.setAceptarBtnVisible(null!=this.anoSelected&&null!=this.entidadSelected&&null!=this.proyectoSelected);
		}
		
		private function cbxsEnabled():void {
			//this.vPestana.setAnoCbxEnabled(null==this.anoSelected);
			//this.vPestana.setEntidadCbxEnabled(null==this.entidadSelected);
		}
	}
}